"""
解题思路

如何统计无重复字符的最长子串？

这里的思路其实是涉及到双指针的概念，即我通过控制一个头尾的滑动窗口来对字符串遍历，
我们仅需要确认每次尾部加入字符的状态就可以了，如果在窗口内无该字符，则尾部移动，
如果窗口内包含该字符，则将头指针移动到窗口内的相同字符的后一项

这里我给出了两个代码，其中代码1是思路的体现，代码2证明在通过集合方式求解该问题可以做到更优的性能

"""
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        head, tail, ans = 0, 0, 0
        while tail < len(s):
            for i in range(head, tail):
                if s[i] == s[tail]:
                    head = i + 1
            ans = max(ans, tail-head+1)
            tail += 1
        return ans

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        sub_set, ans, i = set(), 0, 0
        for j, v in enumerate(s):
            while v in sub_set:
                sub_set.remove(s[i])
                i += 1
            sub_set.add(v)
            ans = max(ans, j-i+1)
        return ans